// 适配器模式
package main

import "fmt"

type Attack interface {
	Fight()
}

// -----------------------------------------------------------------

type DaBaoJian struct{} // 这个实现了Attack接口，形成了一个普通的技能
func (d *DaBaoJian) Fight() {
	fmt.Println("使用了大宝剑技能，将敌人击杀...")
}

// -----------------------------------------------------------------

// 一个中间层，内部持有一个 *PowerOff 对象，实现了 Attack 接口的 Fight() 方法
// 目的：将 PowerOff 的功能适配成 Attack 接口能接受的形式
type Adapter struct {
	powerOff *PowerOff
}

func (a *Adapter) Fight() {
	a.powerOff.ShutDown()
}

// -----------------------------------------------------------------

type PowerOff struct{}

func (p *PowerOff) ShutDown() {
	fmt.Println("电脑即将关机...")
}

// -----------------------------------------------------------------

type Hero struct {
	Name   string
	attack Attack //只要一个类型实现了Attack接口的Fight{}方法，那么它的实例就可以赋值给attack字段
}

func (h *Hero) Skill() {
	fmt.Println(h.Name, "使用了技能")
	h.attack.Fight()
}

// -----------------------------------------------------------------

func NewAdapter(p *PowerOff) *Adapter {
	return &Adapter{p}
}

func main() {
	// gailun := &Hero{"gailun", &DaBaoJian{}}
	gailun := &Hero{"盖伦", NewAdapter(&PowerOff{})}
	gailun.Skill()
}
